package br.com.toscano.gobra.domain;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;

@Entity 
@Table(name="PAGAMENTO")
public class Pagamento  extends ObjetoAbstrato {

	private static final long serialVersionUID = 134533343354520L;
		
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="PAGA_ID")
	private Long id;
	
	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "TPDP_ID")
	private TipoDocumentoPagamento documentoPagamento;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "OBRA_ID")
	private Obra obra;

	@Column(name="PAGA_NOME_RAZAO_SOCIAL", nullable=false, length=255)
	private String nomeRazaoSocial;
	
	@Column(name="PAGA_CNPJ", nullable=false, length=255)
	private String cnpj;

	@Column(name="PAGA_HISTORICO_RESUMIDO", nullable=false, length=255)
	private String historicoResumido;
	
	@Column(name="PAGA_NUM_DOC_AUTORIZACAO", nullable=false, length=255)
	private String numDocAutorizacao;
	
	@Column(name="PAGA_NUM_DOC_PAGAMENTO", nullable=false, length=255)
	private String numDocPagamento;

	@Column(name="PAGA_NUM_DOC_FISCAL", nullable=false, length=255)
	private String numDocFiscal;
	
	@Temporal(TemporalType.DATE)
	@Column(name = "PAGA_DATA_EMISSAO", length = 7, nullable = false)
	private Date dataEmissao;
	
	@Temporal(TemporalType.DATE)
	@Column(name = "BOME_DATA_PAGAMENTO", length = 7, nullable = false)
	private Date dataPagamento;
	
	@Column(name = "PAGA_VALOR_PG", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorPagamento;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name="PAGAMENTO_BOLETIM_MEDICAO",
	    joinColumns = @JoinColumn( name="PAGA_ID"),
	    inverseJoinColumns = @JoinColumn( name="BOME_ID"))
//	@CollectionId(
//			columns = { @Column(name="PAGA_ID"),   @Column(name="BOME_ID")}, generator = "identity", type = @Type(type = "number"))
	private List<BoletimMedicao> listaBoletimMedicao = new ArrayList<BoletimMedicao>();

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public TipoDocumentoPagamento getDocumentoPagamento() {
		return documentoPagamento;
	}

	public void setDocumentoPagamento(TipoDocumentoPagamento documentoPagamento) {
		this.documentoPagamento = documentoPagamento;
	}

	public String getNomeRazaoSocial() {
		return nomeRazaoSocial;
	}

	public void setNomeRazaoSocial(String nomeRazaoSocial) {
		this.nomeRazaoSocial = nomeRazaoSocial;
	}

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public String getHistoricoResumido() {
		return historicoResumido;
	}

	public void setHistoricoResumido(String historicoResumido) {
		this.historicoResumido = historicoResumido;
	}

	public String getNumDocAutorizacao() {
		return numDocAutorizacao;
	}

	public void setNumDocAutorizacao(String numDocAutorizacao) {
		this.numDocAutorizacao = numDocAutorizacao;
	}

	public String getNumDocPagamento() {
		return numDocPagamento;
	}

	public void setNumDocPagamento(String numDocPagamento) {
		this.numDocPagamento = numDocPagamento;
	}

	public String getNumDocFiscal() {
		return numDocFiscal;
	}

	public void setNumDocFiscal(String numDocFiscal) {
		this.numDocFiscal = numDocFiscal;
	}

	public Date getDataEmissao() {
		return dataEmissao;
	}

	public void setDataEmissao(Date dataEmissao) {
		this.dataEmissao = dataEmissao;
	}

	public Date getDataPagamento() {
		return dataPagamento;
	}

	public void setDataPagamento(Date dataPagamento) {
		this.dataPagamento = dataPagamento;
	}

	public BigDecimal getValorPagamento() {
		return valorPagamento;
	}

	public void setValorPagamento(BigDecimal valorPagamento) {
		this.valorPagamento = valorPagamento;
	}

	public List<BoletimMedicao> getListaBoletimMedicao() {
		return listaBoletimMedicao;
	}

	public void setListaBoletimMedicao(List<BoletimMedicao> listaBoletimMedicao) {
		this.listaBoletimMedicao = listaBoletimMedicao;
	}

	public Obra getObra() {
		return obra;
	}

	public void setObra(Obra obra) {
		this.obra = obra;
	}
	
	


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if(!this.getClass().equals(obj.getClass()))
			return false;
		if (getClass() != obj.getClass())
			return false;
		Pagamento other = (Pagamento) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}